]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st/theme: Remove entry from files_by_stylesheet after emitting signal
authorJonas Dreßler <verdre@v0yd.nl>
Mon, 11 May 2020 18:41:37 +0000 (20:41 +0200)
committerFlorian Müllner <florian.muellner@gmail.com>
Thu, 21 May 2020 20:59:35 +0000 (20:59 +0000)
Since e06109c23ce2a6dd53d32c26a89ab46a952d7373 we keep old theme nodes
valid during the emission of the "custom-stylesheets-changed" signal.

It turns out that we might still look up the file of a stylesheet using
the files_by_stylesheet hashtable during the emission of that signal,
causing a crash because the assertion in _st_theme_resolve_url() fails.

So fix that and remove the stylesheet entry from the files_by_stylesheet
hashtable after emitting the "custom-stylesheets-changed" signal. And to
be consistent, also remove the entry from the stylesheets_by_file
hashtable after emitting the signal.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2757
src/st/st-theme.c

index 7ccf7b5bad1d3b695b0fe48c0228bf3da329f74a..3f08833a8a73bfc4a968ab8097aecccdef78b3b0 100644 (file)
@@ -285,11 +285,15 @@ st_theme_unload_stylesheet (StTheme    *theme,
     return;
 
   theme->custom_stylesheets = g_slist_remove (theme->custom_stylesheets, stylesheet);
-  g_hash_table_remove (theme->stylesheets_by_file, file);
-  g_hash_table_remove (theme->files_by_stylesheet, stylesheet);
 
   g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
 
+  /* We need to remove the entry from the hashtable after emitting the signal
+   * since we might still access the files_by_stylesheet hashtable in
+   * _st_theme_resolve_url() during the signal emission.
+   */
+  g_hash_table_remove (theme->stylesheets_by_file, file);
+  g_hash_table_remove (theme->files_by_stylesheet, stylesheet);
   cr_stylesheet_unref (stylesheet);
 }